package com.yang.designmode.prototype.business;

import java.io.*;
import java.util.HashMap;
import java.util.List;

/**
 * 系统A要同步数据中的统计发数据
 * 保证数据的一致性
 */
public class ProtoType_4 {
    //记录缓存 检索统计数据
    private HashMap<String, SearchWord> currentKeyWords = new HashMap<>();
    private long lastUpdateTime = -1;

    /**
     * 系统A需要调用同步的方法
     * 1. 根据时间戳查询出对应的统计数据
     * 2. 遍历每条统计数据
     * 3. 比较已经缓存的数据，存在就替换，不存在就删除
     * 存在的问题：更新的时刻，无法保证一致性
     */
    public void refresh() throws Exception {
        //记录新的数据
        HashMap<String, SearchWord> newKeyWords = (HashMap<String, SearchWord>) deeppClone(currentKeyWords);


        // 根据时间戳查询出对应的记录信息
        List<SearchWord> list = getSearchWords(lastUpdateTime);
        long maxNewUpdateTime = lastUpdateTime;
        if(list!=null){
            // 遍历每条统计数据
            for (SearchWord data : list) {
                if(data.getLastUpdateTime()>maxNewUpdateTime){
                    maxNewUpdateTime = data.getLastUpdateTime();
                }
                if (newKeyWords.containsKey(data.getKeyWord())) {
                    newKeyWords.replace(data.getKeyWord(), data);
                } else {
                    newKeyWords.put(data.getKeyWord(), data);
                }
            }
            lastUpdateTime=maxNewUpdateTime;
            currentKeyWords = newKeyWords;
        }
    }

    private List<SearchWord> getSearchWords(long lastUpdateTime){


        return null;
    }

    public Object deeppClone(Object obj) throws Exception {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return ois.readObject();
    }
}
